home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 081 / uplimit.arc / UPLIMIT.C next >
C/C++ Source or Header  |  1986-10-03  |  6KB  |  184 lines

  1. /*  UPLIMIT - Limit uploads unless we have room
  2.  
  3.     Version 1.10, created on 10/03/86 at 02:37:21
  4.  
  5. (C) COPYRIGHT 1986 by System Enhancement Associates; ALL RIGHTS RESERVED
  6.  
  7.     By:  Thom Henderson
  8.  
  9.     Description:
  10.          This program changes the privilege level of the Fido Upload
  11.          command based on the amount of room left on the upload disk.
  12.  
  13.     Instructions:
  14.          Run this program with a statement of the form:
  15.  
  16.               uplimit [<drive>] <limit>
  17.  
  18.          The <drive> is given in standard DOS notation of A:, B:, etc.
  19.          if no drive is specified, then the current drive is used.
  20.  
  21.          The <limit> is the threshold value.  If the disk in question has
  22.          that much room or more, then uploads will be permitted.  If it
  23.          has less than that amount of available room, then uploads will
  24.          be restricted.
  25.  
  26.          A <limit> may be specified in any of the following ways:
  27.  
  28.               1234           1234 bytes.
  29.               1234K          1234 times 1024 bytes.
  30.               1234M          1234 times 1024 times 1024 bytes.
  31.  
  32.          As distributed, this program will restrict uploads by making it
  33.          a privileged command, and enable uploads by making it a normal
  34.          command.
  35.  
  36.     SPECIAL NOTES:
  37.          This program is the copyrighted property of System Enhancement
  38.          Associates.  You are permitted to copy and distribute it,
  39.          subject to the following conditions:
  40.  
  41.               1) It must be distributed in its original, unaltered form.
  42.  
  43.               2) It must be distributed as a complete set of all files.
  44.  
  45.               3) You may NOT charge in any way for such distribution.
  46.  
  47.          You are also permitted to modify it to suit your needs, provided
  48.          only that you do not distribute the modified version.
  49.  
  50.     Language:
  51.          Computer Innovations Optimizing C86
  52. */
  53. #include <stdio.h>
  54.  
  55. /* User privelege levels */
  56.  
  57. #define TWIT -2                        /* jerk */
  58. #define DISGRACE 0                     /* disgraced user */
  59. #define NORMAL 2                       /* normal user */
  60. #define PRIVEL 4                       /* privileged user */
  61. #define EXTRA 6                        /* extra privileges */
  62. #define SYSOP 10                       /* da boss */
  63.  
  64. struct privs                           /* priv file entry structure */
  65. {   char menu[20];                     /* menu line */
  66.     int level;                         /* minimum privelege to use */
  67. }   ;
  68.  
  69. long roomleft(drive)                   /* find room left on a drive */
  70. int drive;                             /* drive; 0=default, 1=A:, etc. */
  71. {
  72.     struct {int ax,bx,cx,dx,si,di,ds,es;} reg;
  73.     long room, report;
  74.     char *units = " bytes";
  75.  
  76.     reg.ax = 0x3600;                   /* get disk free space */
  77.     reg.dx = drive;
  78.     sysint21(®,®);               /* DOS call */
  79.  
  80.     if(reg.ax==0xffff)
  81.          abort("%c: is an invalid drive",'A'+drive-1);
  82.  
  83.     room = report = (long)reg.bx * (long)reg.cx * (long)reg.ax;
  84.  
  85.     if(report>=1024)
  86.     {    report /= 1024;
  87.          units = "K";
  88.          if(report>=1024)
  89.          {    report /= 1024;
  90.               units = " meg";
  91.          }
  92.     }
  93.  
  94.     printf("%ld%s free on",report,units);
  95.     if(drive)
  96.          printf(" drive %c:\n",'A'+drive-1);
  97.     else printf(" current drive.\n");
  98.  
  99.     return room;
  100. }
  101.  
  102. main(nargs,arg)                        /* system entry point */
  103. int nargs;                             /* number of arguments */
  104. char *arg[];                           /* pointers to arguments */
  105. {
  106.     FILE *fp, *fopen();                /* priv file, opener */
  107.     long fploc = 0, fseek();           /* prive file pointer, seeker */
  108.     struct privs priv;
  109.     long limit;                        /* threshold value */
  110.     char mod;                          /* modifier */
  111.     int drive = 0;                     /* drive to check */
  112.     int n;
  113.  
  114.     fprintf(stderr,"UpLimit; Version 1.10, created on 10/03/86 at 02:37:21\n");
  115.     fprintf(stderr,"(C) COPYRIGHT 1986 by System Enhancement Associates;");
  116.     fprintf(stderr," ALL RIGHTS RESERVED\n\n");
  117.  
  118.     if(nargs<2)
  119.          usage();
  120.  
  121.     if(arg[1][1]==':')
  122.     {    drive = toupper(arg[1][0]) - 'A' + 1;
  123.          arg[1] = arg[2];              /* sloppy technique, I know */
  124.     }
  125.  
  126.     if(!(n=sscanf(arg[1],"%ld%c",&limit,&mod)))
  127.          usage();
  128.     if(n>1)                            /* fix limit if modifier given */
  129.     {    mod = toupper(mod);
  130.          if(mod=='M' || mod=='K')
  131.               limit *= 1024L;
  132.          else usage();
  133.          if(mod=='M')
  134.               limit *= 1024L;
  135.     }
  136.  
  137.     if(!(fp=fopen("FILEPRIV.BBS","rwb")))
  138.          abort("Cannot read/alter FILEPRIV.BBS");
  139.  
  140.     while(fread(&priv,sizeof(priv),1,fp))
  141.     {    if(toupper(*priv.menu)=='U')
  142.          {    if(roomleft(drive) < limit)
  143.               {    printf("Too little room left.  Uploads restricted.\n");
  144.                    priv.level = PRIVEL;
  145.               }
  146.               else
  147.               {    printf("Suffucient room left.  Uploads permitted.\n");
  148.                    priv.level = NORMAL;
  149.               }
  150.  
  151.               fseek(fp,fploc,0);
  152.               fwrite(&priv,sizeof(priv),1,fp);
  153.               exit(0);
  154.          }
  155.          else fploc = fseek(fp,0L,1);
  156.     }
  157.  
  158.     abort("U)pload command not found");
  159. }
  160.  
  161. usage()
  162. {
  163.     printf("Changes permission level of the Fido U)pload command based\n");
  164.     printf("on space available.\n\n");
  165.  
  166.     printf("Usage: uplimit [<drive>] [<limit>]\n\n");
  167.  
  168.     printf("Where: <drive> is a standard DOS format drive specifier\n");
  169.     printf("       of A:, B:, et cetera.  If no drive is specified,\n");
  170.     printf("       then the current drive is tested.\n\n");
  171.  
  172.     printf("       <limit> is the threshold value.  If that amount of\n");
  173.     printf("       room is available, then uploads will be permitted.\n");
  174.     printf("       Otherwise, uploads will be restricted.\n\n");
  175.  
  176.     printf("A <limit> may be specified in any of the following ways:\n\n");
  177.  
  178.     printf("     1234           1234 bytes.\n");
  179.     printf("     1234K          1234 times 1024 bytes.\n");
  180.     printf("     1234M          1234 times 1024 times 1024 bytes.\n");
  181.  
  182.     exit(-1);
  183. }
  184.